package de.dis2011.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;

import de.dis2011.data.DB2ConnectionManager;

/**
 * Haus-Bean
 */
public class Haus {
	private int 	id = -1;
	private String 	ort;
	private String 	plz;
	private String 	strasse;
	private String 	hausnr;
	private int 	flaeche;
	private int 	stockwerk;
	private int 	kaufpreis;
	private boolean	garten;
	private int 	verwalter;
	
	public int getId() {return id;}
	public void setId(int id) {	this.id = id;}
	
	public String getOrt() {return ort;}
	public void setOrt(String ort) {this.ort = ort;}
	
	public String getPlz() {return plz;}
	public void setPlz(String plz) {this.plz = plz;}
	
	public String getStrasse() {return strasse;}
	public void setStrasse(String strasse) {this.strasse = strasse;}
	
	public String getHausnr() {return hausnr;}
	public void setHausnr(String hausnr) {this.hausnr = hausnr;}
	
	public int getFlaeche() {return flaeche;}
	public void setFlaeche(int flaeche) {this.flaeche = flaeche;}
	
	public int getStockwerk() {return stockwerk;}
	public void setStockwerk(int stockwerk) {this.stockwerk = stockwerk;}
	
	public int getKaufpreis() {return kaufpreis;}
	public void setKaufpreis(int kaufpreis) {this.kaufpreis = kaufpreis;}
	
	public boolean getGarten() {return garten;}
	public void setGarten(Boolean garten) {this.garten = garten;}
	
	public int getVerwalter() {return verwalter;}
	public void setVerwalter(int verwalter) {this.verwalter = verwalter;}
	
	/**
	 * L�dt ein Haus aus der Datenbank
	 * @param id ID des zu ladenden Hauses
	 * @return Haus-Instanz
	 */
	public static Haus load(int id) {
		try {
			// Hole Verbindung
			Connection con = DB2ConnectionManager.getInstance().getConnection();

			// Erzeuge Anfrage
			String selectSQL = "SELECT * FROM haus WHERE id = ?";
			PreparedStatement pstmt = con.prepareStatement(selectSQL);
			pstmt.setInt(1, id);

			// F�hre Anfrage aus
			ResultSet rs = pstmt.executeQuery();
			if (rs.next()) {
				Haus ts = new Haus();
				ts.setId(rs.getInt("ID"));
				ts.setOrt(rs.getString("ort"));
				ts.setPlz(rs.getString("plz"));
				ts.setStrasse(rs.getString("strasse"));
				ts.setHausnr(rs.getString("hausnr"));
				ts.setFlaeche(rs.getInt("flaeche"));
				ts.setStockwerk(rs.getInt("stockwerk"));
				ts.setKaufpreis(rs.getInt("kaufpreis"));
				ts.setGarten(rs.getBoolean("garten"));
				ts.setVerwalter(rs.getInt("verwalter"));
				
				rs.close();
				pstmt.close();
				return ts;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * L�dt alle H�user aus der Datenbank
	 * @param id ID des zu ladenden Maklers
	 * @return alle Makler
	 */
	public static ArrayList<Haus> loadAll() {
		try {
			// Hole Verbindung
			Connection con = DB2ConnectionManager.getInstance().getConnection();

			// Erzeuge Anfrage
			String selectSQL = "SELECT * FROM haus";
			PreparedStatement pstmt = con.prepareStatement(selectSQL);

			// F�hre Anfrage aus
			ResultSet rs = pstmt.executeQuery();
			ArrayList<Haus> allHaus = new ArrayList<Haus>();
			while (rs.next()) {
				Haus ts = new Haus();
				ts.setId(rs.getInt("id"));
				ts.setOrt(rs.getString("ort"));
				ts.setPlz(rs.getString("plz"));
				ts.setStrasse(rs.getString("strasse"));
				ts.setHausnr(rs.getString("hausnr"));
				ts.setFlaeche(rs.getInt("flaeche"));
				ts.setStockwerk(rs.getInt("stockwerk"));
				ts.setKaufpreis(rs.getInt("kaufpreis"));
				ts.setGarten(rs.getBoolean("garten"));
				ts.setVerwalter(rs.getInt("verwalter"));

				allHaus.add(ts);
			}
			rs.close();
			pstmt.close();
			return allHaus;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * Speichert den Makler in der Datenbank. Ist noch keine ID vergeben
	 * worden, wird die generierte Id von DB2 geholt und dem Model �bergeben.
	 */
	public void save() {
		// Hole Verbindung
		Connection con = DB2ConnectionManager.getInstance().getConnection();

		try {
			// FC<ge neues Element hinzu, wenn das Objekt noch keine ID hat.
			if (getId() == -1) {
				// Achtung, hier wird noch ein Parameter mitgegeben,
				// damit sp�ter generierte IDs zur�ckgeliefert werden!
				String insertSQL = "INSERT INTO Haus(ort, plz, strasse, hausnr, flaeche, stockwerk, kaufpreis,  garten, verwalter) VALUES (?,?,?,?,?,?,?,?,?)";

				PreparedStatement pstmt = con.prepareStatement(insertSQL,
						Statement.RETURN_GENERATED_KEYS);

				// Setze Anfrageparameter und f�hre Anfrage aus
				pstmt.setString	(1, getOrt());
				pstmt.setString	(2, getPlz());
				pstmt.setString	(3, getStrasse());
				pstmt.setString	(4, getHausnr());
				pstmt.setInt	(5, getFlaeche());
				pstmt.setInt	(6, getStockwerk());
				pstmt.setInt	(7, getKaufpreis());
				pstmt.setBoolean(8, getGarten());
				pstmt.setInt	(9, getVerwalter());
				
				pstmt.executeUpdate();

				// Hole die Id des engef�gten Datensatzes
				ResultSet rs = pstmt.getGeneratedKeys();
				if (rs.next()) {
					setId(rs.getInt(1));
				}

				rs.close();
				pstmt.close();
			} else {
				// Falls schon eine ID vorhanden ist, mache ein Update...
				String updateSQL = "UPDATE Haus SET ort = ?, plz = ?, strasse = ?, hausnr = ?, flaeche = ?, stockwerk = ?, kaufpreis = ?, garten = ?,  Verwalter = ? WHERE id = ?";
				PreparedStatement pstmt = con.prepareStatement(updateSQL);

				// Setze Anfrage Parameter
				pstmt.setString	(1, getOrt());
				pstmt.setString	(2, getPlz());
				pstmt.setString	(3, getStrasse());
				pstmt.setString	(4, getHausnr());
				pstmt.setInt	(5, getFlaeche());
				pstmt.setInt	(6, getStockwerk());
				pstmt.setInt	(7, getKaufpreis());
				pstmt.setBoolean(9, getGarten());
				pstmt.setInt	(11, getVerwalter());
				pstmt.setInt	(12, getId());
				pstmt.executeUpdate();

				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * L�scht den Makler in der Datenbank.
	 * @param id des zu l�schenden Maklers
	 */
	public void delete(int id) {
		// Hole Verbindung
		Connection con = DB2ConnectionManager.getInstance().getConnection();

		try {
			if (id != -1) {
				String insertSQL = "Delete haus where id = ?";

				PreparedStatement pstmt = con.prepareStatement(insertSQL,
						Statement.RETURN_GENERATED_KEYS);

				// Setze Anfrageparameter und f�hre Anfrage aus
				pstmt.setInt(1, id);
				pstmt.executeUpdate();

				
				pstmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
